package com.qianfeng1.day7_连接池.dao.impl;


import com.qianfeng1.day7_连接池.dao.UserDao;
import com.qianfeng1.day7_连接池.jdbc.ConnectionPool;
import com.qianfeng1.day8_wednesday.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 作者：黎杭
 * 日期：2020/2/18
 */
public class UserDaoImpl implements UserDao {


    @Override
    public User findUserById(int i) throws SQLException {// 在这里就是真正的去访问数据了
//        User user = new User();
//        user.setUserId(1);
//
//        User byMapper = findByMapper(user);


        // 第一步，拿到Connection对象,有很多种方法

        Connection connection = ConnectionPool.getConnection();

        String sql = "select * from user where user_id=?";// sql语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, i);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            User u = new User();
            int userId = resultSet.getInt(1);
            String name = resultSet.getString(2);
            int age = resultSet.getInt(3);
            int weight = resultSet.getInt(4);
            int height = resultSet.getInt(5);
            u.setAge(age);
            u.setName(name);
            u.setHeight(height);
            u.setWeight(weight);
            u.setUserId(userId);
            return u;// 直接返回用户对象
        }
        return null;
    }

    @Override
    public boolean updateUserById(User user) throws SQLException {// Dao的异常抛到业务层处理
        // 第一步，拿到Connection对象,有很多种方法
        Connection connection = ConnectionPool.getConnection();// 这是不够完美的地方
        String sql = "update user set name=? where user_id=?";// sql语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);// 这是不够完美的地方

        preparedStatement.setString(1, user.getName());// 设置参数也麻烦
        preparedStatement.setInt(2, user.getUserId()); // 设置参数也麻烦
        return preparedStatement.executeUpdate() == 1;// 如果返回的影响的行数等于1，表示更新成功
    }

    @Override
    public User findAndUpdate(User userQuery) throws Exception {// 传统做法
        // 第一步，拿到Connection对象,有很多种方法
//        Connection connection = ConnectionPool.getConnection();
//        String sql = "select * from user where user_id=?";// sql语句
//        PreparedStatement preparedStatement = connection.prepareStatement(sql);
//        preparedStatement.setInt(1, userQuery.getUserId());// 设置参数
//        ResultSet resultSet = preparedStatement.executeQuery();// 进行查询操作
//        User u = new User();
//        while (resultSet.next()) {// 这里由于userId 是主键，所有只有一行结果，while循环一次，就会跳出循环
//            int userId = resultSet.getInt(1);
//            String name = resultSet.getString(2);
//            int age = resultSet.getInt(3);
//            int weight = resultSet.getInt(4);
//            int height = resultSet.getInt(5);
//            u.setAge(age);
//            u.setName(name);
//            u.setHeight(height);
//            u.setWeight(weight);
//            u.setUserId(userId);
////            break;
//        }
        User u = this.findUserById(userQuery.getUserId());// 直接调用本类的查询方法即可，没有必要再写


        // 第二步操作：判断用户的年龄是否小于25岁
        if (u.getAge() < 25) {// 符合年龄小于25岁的需求，那么就需要把名字取出来，加上后缀
//            String name = u.getName();
//            name += "-年青";
//            // 第三步： 需要把这个名字在数据库里边进行修改操作
//            String updateSql = "update user set name=? where user_id=?";
//            PreparedStatement preparedStatement1 = connection.prepareStatement(updateSql);
//            preparedStatement1.setString(1, name);// 设置参数
//            preparedStatement1.setInt(2, u.getUserId());// 设置参数
//
//            int i = preparedStatement1.executeUpdate();
//
//            if (i == 1) {// 被更新的行数是1，表示更新成功，就应该返回被更新之后的user对象
//                u.setName(name);// 把更新之后的名字设置回去，返回u
//                return u;//
//            }
            this.updateUserById(u);
            return u;
        }
        return u;// 最后返回u
    }

    /**
     * 这个方法只是完成第一步而已
     *
     * @return
     * @throws SQLException
     */
    @Override
    public List<User> findAllUsers() throws SQLException {
        // 第一步，拿到Connection对象,有很多种方法
        Connection connection = ConnectionPool.getConnection();
        String sql = "select * from user ";// sql语句，扫表
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        List<User> resList = new ArrayList<>();// 存放查询用户的结果的集合
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {// 解析查询出来的数据
            User u = new User();
            int userId = resultSet.getInt(1);// 魔法数字？
            String name = resultSet.getString(2);
            int age = resultSet.getInt(3);
            int weight = resultSet.getInt(4);



            // 就算不写数字，用查找列名获取下标
            int height = resultSet.getInt(resultSet.findColumn("height"));// 现在还只是5列，假如一个表有50列呢？
            u.setAge(age);
            u.setName(name);
            u.setHeight(height);
            u.setWeight(weight);
            u.setUserId(userId);
            resList.add(u);
        }
        return resList;
    }
}
